<?php defined('SYSPATH') OR die('No direct access allowed.');

/**
 * Classe de controle das funções mais comuns relacionados ao aluno
 * @author marcio
 *
 */
class Regras_Aluno{

	const N = "[0-9]";
	const L = "[A-Za-z]";
	
	public function __construct(){
		//ainda não faz nada
	}
	
	/**
	 * gera o digito verificador da matricula
	 * @param $matricula matricula sem o digito verificador no formato NNLNNNN
	 * @return Int Digito verificador
	 */
	public function gerar_digito_matricula($matricula){
		$position = 0;
		$soma = 0;
		$v = 0;
		while($position<strlen($matricula)){
			$c = $matricula[$position];
			if($this->isEREG(self::N, $c)){
				$v += $c;
			}elseif($this->isEREG(self::L, $c)){
				$v += ord(strtoupper($c));
			}else{
				throw new Exception('Caractere Invalido Para Matricula.');
			}
			$position++;
			$soma = $v * (9 - $position);
		}
		$soma = $soma * 10;
		$digito = $soma % 11;
		if($digito==10)
			$digito = 0;
		return $digito;
	}
	
    /**
     * verifica se a matricula é verdadeira
     * @param $matricula matricula no formato NNLNNNND
     * @return boolean retorna TRUE se o digito for verdadeiro
     */
	public function verificar_matricula($matricula){
		$ano	= $this->get_ano($matricula);
		$letra	= $this->get_letra($matricula);
		$numero	= $this->get_numero($matricula);
		$digito = $this->get_digito($matricula);
		if(!$this->isEREG(self::N, $ano)){
			throw new Exception('Ano não inteiro. esperado valor inteiro para o ano: '. $ano);
		}
		if(!$this->isEREG(self::L, $letra)){
			throw new Exception('Letra não é um caractere valido. esperado caractere para letra: '. $letra);
		}
		if(!$this->isEREG(self::N, $numero)){
			throw new Exception('Numero não inteiro. esperado valor inteiro para numero: '. $numero);
		}
		if(!$this->isEREG(self::N, $digito)){
			throw new Exception('Letra não inteiro. esperado valor inteiro para numero: '. $digito);
		}
		$mat = $ano.$letra.$numero;
		$dig = $this->gerar_digito_matricula($mat);
		if($dig==$digito){
			return true;
		}else{
			return false;
		}
	}
	
	public function get_digito($matricula){
		if(strlen($matricula)==8){
			return $matricula[7];
			return substr($matricula, 7, 1);
		}else{
			throw new Exception('Tamanho da matricula invalido. Tamanho esperado : 8, Tamanho atual: '.strlen($matricula));
		}
	}
	public function get_ano($matricula){
		if(strlen($matricula)==8){
			return substr($matricula, 0, 2);
		}else{
			throw new Exception('Tamanho da matricula invalido. Tamanho esperado : 8, Tamanho atual: '.strlen($matricula));
		}
	}
	public function get_letra($matricula){
		if(strlen($matricula)==8){
			return strtoupper(substr($matricula, 2, 1));
		}else{
			throw new Exception('Tamanho da matricula invalido. Tamanho esperado : 8, Tamanho atual: '.strlen($matricula));
		}
	}
		public function get_numero($matricula){
		if(strlen($matricula)==8){
			return substr($matricula, 3, 4);
		}else{
			throw new Exception('Tamanho da matricula invalido. Tamanho esperado : 8, Tamanho atual: '.strlen($matricula));
		}
	}
	
	/**
	 * verifica se uma expressão regular bate com um determinado caractere
	 * @param $er expressão regular
	 * @param $c caractere para comparação
	 * @return boolean se a expressão casar retorna TRUE senão FALSE
	 */
	protected function isEREG($er, $c){
    	$r = ereg($er, $c);
    	if($r==0){
    		return false;
    	}else{
    		return true;
    	}
    }
	
}